#ifndef LUA_TABLE_WRAPPER_H
#define LUA_TABLE_WRAPPER_H

/**
 * @file LuaTableWrapper.h
 * @brief 提供C++到Lua的表操作封装，支持嵌套表和多种数据类型
 */

extern "C" {
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
}

#include <string>
#include <unordered_map>
#include <any>
#include <memory>

/**
 * @class LuaTableWrapper
 * @brief 封装Lua表操作的C++类，支持.和[]访问方式
 */
class LuaTableWrapper {
public:
    LuaTableWrapper();
    ~LuaTableWrapper();

    /**
     * @brief 设置字符串键对应的值
     * @param key 字符串键
     * @param value 要设置的值，可以是多种类型
     */
    void set(const std::string& key, const std::any& value);
    
    /**
     * @brief 设置整数键对应的值
     * @param key 整数键
     * @param value 要设置的值，可以是多种类型
     */
    void set(int key, const std::any& value);
    
    /**
     * @brief 获取字符串键对应的值
     * @param key 字符串键
     * @return 返回存储的值，如果不存在返回空any
     */
    std::any get(const std::string& key) const;
    
    /**
     * @brief 获取整数键对应的值
     * @param key 整数键
     * @return 返回存储的值，如果不存在返回空any
     */
    std::any get(int key) const;
    
    /**
     * @brief 删除字符串键对应的值
     * @param key 要删除的字符串键
     */
    void remove(const std::string& key);
    
    /**
     * @brief 删除整数键对应的值
     * @param key 要删除的整数键
     */
    void remove(int key);
    
    /**
     * @brief 创建并返回一个新的嵌套表，关联到字符串键
     * @param key 字符串键
     * @return 返回新创建的嵌套表指针
     */
    std::shared_ptr<LuaTableWrapper> create_table(const std::string& key);
    
    /**
     * @brief 创建并返回一个新的嵌套表，关联到整数键
     * @param key 整数键
     * @return 返回新创建的嵌套表指针
     */
    std::shared_ptr<LuaTableWrapper> create_table(int key);
    
    // 清空表内容
    void clear();
    
    // Lua绑定相关函数
    static int lua_new(lua_State* L);
    static int lua_index(lua_State* L);
    static int lua_newindex(lua_State* L);
    static int lua_gc(lua_State* L);
    static int lua_pairs(lua_State* L);
    static int lua_ipairs(lua_State* L);
    static int lua_len(lua_State* L);
    
    static void register_class(lua_State* L);
    static void create_global_table(lua_State* L, const char* name);

private:
    /// 字符串键值对存储
    std::unordered_map<std::string, std::any, std::hash<std::string>, std::equal_to<>> string_keys;
    
    /// 整数键值对存储
    std::unordered_map<int, std::any> int_keys;
    
    /// 嵌套表缓存，用于管理生命周期
    std::vector<std::shared_ptr<LuaTableWrapper>> nested_tables;
};

/**
 * @namespace LActor
 * @brief 提供特定于actor的表操作接口
 */
namespace LActor {
    /**
     * @brief 获取与actor关联的表变量
     * @param L Lua状态机
     * @return 返回表变量数量(1)
     */
    int getActorTableVar(lua_State* L);
    
    /**
     * @brief 注册LActor命名空间到Lua环境
     * @param L Lua状态机
     */
    void register_namespace(lua_State* L);
}

#endif // LUA_TABLE_WRAPPER_H